package org.biubiu0002.baiblog.core.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.biubiu0002.baiblog.common.utils.PageUtils;
import org.biubiu0002.baiblog.core.model.entity.ShareEntity;
import org.biubiu0002.baiblog.core.model.vo.ShareVo;
import org.biubiu0002.baiblog.core.model.vo.req.CommentReqVo;
import org.biubiu0002.baiblog.core.model.vo.req.SharePostReqVo;
import org.biubiu0002.baiblog.core.model.vo.res.CommentPostResVo;
import org.biubiu0002.baiblog.core.model.vo.res.ShareBoardItemVo;
import org.biubiu0002.baiblog.core.model.vo.res.ShareInfoVo;
import org.biubiu0002.baiblog.core.model.vo.res.SharePostResVo;

import java.util.List;
import java.util.Map;

/**
 * 分享内容表
 *
 * @author biubiu0002
 * @email 1007918011@qq.com
 * @date 2022-05-06 00:50:37
 */
public interface ShareService extends IService<ShareEntity> {

    /**
     * 首页推文列表
     * @param params 分页查询
     * @return 首页推文列表
     */
    PageUtils queryIndexPage(Map<String, Object> params);

    /**
     * 发布推文
     * @param sharePostReqVo 推文内容
     * @return 发布推文状态
     */
    SharePostResVo postShare(SharePostReqVo sharePostReqVo);

    /**
     * 点赞推文
     * @param shareId 推文id
     */
    void likeShare(String shareId);

    /**
     * 取消点赞推文
     * @param shareId 推文id
     */
    void unLikeShare(String shareId);

    /**
     * 我发布的推文
     * @param params 分页参数
     * @return 结果
     */
    PageUtils queryMyPage(Map<String, Object> params);

    /**
     * 评论推文
     * @param shareId 推文id
     * @param commentReqVo 评论内容
     * @return 响应结果
     */
    CommentPostResVo comment(String shareId, CommentReqVo commentReqVo);

    /**
     * 回复评论
     * @param commentedId 评论id
     * @param commentReqVo 回复内容
     * @return 响应结果
     */
    CommentPostResVo reply(String commentedId, CommentReqVo commentReqVo);

    /**
     * 获取我收藏的分享
     * @param params 分页参数
     * @return 结果
     */
    PageUtils queryMyFavorPage(Map<String, Object> params);

    /**
     * 收藏分享
     * @param shareId 分享id
     */
    void favorShare(String shareId);

    /**
     * 取消收藏分享
     * @param shareId 分享id
     */
    void unFavorShare(String shareId);

    /**
     * 分享的评论-分页
     * @param shareId 分享id
     * @param params 分页参数
     * @return
     */
    PageUtils queryCommentsPage(String shareId, Map<String, Object> params);

    /**
     * 恢复到点赞周榜中
     * @param shareId shareId
     */
    void recoverFromLikeCountBoard(String shareId);

    /**
     * 从点赞周榜中移除
     * @param shareId shareId
     */
    void removeFromLikeCountBoard(String shareId);

    /**
     * 每周点赞排行榜
     * @return 每周点赞排行榜
     */
    List<ShareBoardItemVo> getLikeCountBoard();


    /**
     * 根据分享id获取榜单展示内容 - 从缓存中取 没有命中则从db取 缓存时间1周+随机时间
     * @param shareIdList 分享idList
     * @return 榜单展示list
     */
    Map<String, ShareBoardItemVo> getShareLikeCountBoardItemVoMap(List<String> shareIdList);


    /**
     * 添加到最新榜单
     * @param shareId shareId
     */
    void insertIntoLatestBoard(String shareId);

    /**
     * 最新榜单恢复不可见的记录
     * @param shareId shaerId
     */
    void recoverFromLatestBoard(String shareId);

    /**
     * 从最新榜单中移除
     * @param shareId shareId
     */
    void removeFromLatestBoard(String shareId);

    /**
     * 最新发布榜 返回最新发布的10条动态
     * @return 最新发布榜
     */
    List<ShareBoardItemVo> getLatestBoard();

    /**
     * 分页查询回复
     * @param commentedId 被评论id
     * @param params 分页参数
     * @return 查询结果
     */
    PageUtils queryRepliesPage(String commentedId, Map<String, Object> params);


    /**
     * 推文基本信息，核心接口，从缓存中读，若不存在，从db读，缓存到redis中。
     * 基本信息即：除了用户相关态，点赞评论收藏数等动态数据的基本信息，如推文内容 图片 发布人 头像 昵称。
     * @param shareId 推文id
     * @return 推文基本信息
     */
    ShareInfoVo getShareInfoVoByShareId(String shareId);

    /**
     * 推文基本信息列表
     * @param shareIdList 推文id列表
     * @return 推文基本信息列表
     */
    List<ShareInfoVo> getInfoListByShareIdList(List<String> shareIdList);

    /**
     * 推文详情 从缓存读取 没有则读db
     * @param shareId 推文id
     * @return 推文详情
     */
    ShareVo getItemByShareId(String shareId);

    /**
     * 推文详情 从缓存读取 没有则读db
     * @param shareIdList 推文id列表
     * @return 推文详情列表
     */
    List<ShareVo> getItemsByShareIdList(List<String> shareIdList);

    /**
     * 根据id获取po, status为0的po
     * @param shareId id
     * @return po
     */
    ShareEntity getByShareId(String shareId);

    /**
     * 根据id获取po, 包括status为1的po
     * @param shareId id
     * @return po
     */
    ShareEntity getByShareIdAll(String shareId);
    /**
     * 更新分享内容/状态
     * 修改后删redis中 推文基本信息的缓存
     * @param shareId 分享id
     * @param sharePostReqVo 修改内容
     * @return 更新结果
     */
    SharePostResVo updateShare(String shareId,SharePostReqVo sharePostReqVo );

    /**
     * 管理员修改分享状态(拉黑)
     * @param shareId 推文id
     * @param status 推文状态
     */
    void updateShareStatus(String shareId,Integer status);

    /**
     * 管理员修改分享可见状态(拉黑)
     * @param shareIdList 推文idList
     * @param status 推文状态
     */
    void updateShareListStatus(List<String> shareIdList,Integer status);

    /**
     * 获取用户发布过的推文列表
     * @param userUid 用户id
     * @return 推文列表
     */
    List<ShareEntity> getShareListByUserUid(String userUid);

    /**
     * 获取用户发布过的全量推文列表（包括被删除的）
     * @param userUid 用户id
     * @return 推文列表
     */
    List<ShareEntity> getShareListByUserUidAll(String userUid);

    /**
     * 获取用户发布过的推文列表，包括被拉黑删除的
     * @param userUid 用户id
     * @return 推文列表
     */
    List<ShareEntity> getShareAllListByUserUid(String userUid);


    /**
     * 搜索
     * @param params 分页参数 key:关键字
     * @return 分页
     */
    PageUtils searchPage(Map<String, Object> params);

    /**
     * 用户删除推文
     * @param shareId 推文id
     */
    void deleteShare(String shareId);

    /**
     * 根据关注人List获取feedId列表
     * @param followList 关注人list
     * @param timestamp 时间戳
     * @return shareEntities
     */
    List<ShareEntity> loadFeedByFollowsByCreateTime(List<String> followList,Long timestamp);

    /**
     * 根据uid查找发布的推文列表
     * @param params 分页参数
     * @param uid 用户id
     * @return 结果
     */
    PageUtils queryPage(Map<String, Object> params, String uid);
}

